Latviešu

Izpētiet TypeScript veidņu literāļu tipus un to, kā tos izmantot, lai izveidotu tipdrošas un uzturamas API saskarnes, uzlabojot koda kvalitāti un izstrādātāja pieredzi.

TypeScript veidņu literāļu tipi tipdrošām API saskarnēm

TypeScript veidņu literāļu tipi ir jaudīga funkcija, kas ieviesta TypeScript 4.1 versijā un ļauj veikt virkņu manipulācijas tipu līmenī. Tie paver plašas iespējas, lai izveidotu ļoti tipdrošas un uzturamas API saskarnes, ļaujot notvert kļūdas kompilēšanas laikā, kas citādi parādītos tikai izpildes laikā. Tas, savukārt, nodrošina uzlabotu izstrādātāja pieredzi, vieglāku refaktorēšanu un robustāku kodu.

Kas ir veidņu literāļu tipi?

Būtībā veidņu literāļu tipi ir virkņu literāļu tipi, kurus var izveidot, kombinējot virkņu literāļu tipus, apvienojumu tipus un tipu mainīgos. Tos var uzskatīt par virkņu interpolāciju tipiem. Tas ļauj izveidot jaunus tipus, balstoties uz esošajiem, nodrošinot augstu elastības un izteiksmīguma pakāpi.

Šeit ir vienkāršs piemērs:

type Greeting = "Hello, World!";

type PersonalizedGreeting<T extends string> = `Hello, ${T}!`;

type MyGreeting = PersonalizedGreeting<"Alice">; // type MyGreeting = "Hello, Alice!"

Šajā piemērā PersonalizedGreeting ir veidnes literāļa tips, kas pieņem vispārīgu tipa parametru T, kuram jābūt virknei. Pēc tam tas izveido jaunu tipu, interpolējot virknes literāli "Hello, " ar T vērtību un virknes literāli "!". Iegūtais tips, MyGreeting, ir "Hello, Alice!".

Veidņu literāļu tipu izmantošanas priekšrocības

Pielietojums reālajā dzīvē

1. API galapunkta definēšana

Veidņu literāļu tipus var izmantot, lai definētu API galapunktu tipus, nodrošinot, ka API tiek nodoti pareizie parametri un atbilde tiek pareizi apstrādāta. Apsveriet e-komercijas platformu, kas atbalsta vairākas valūtas, piemēram, USD, EUR un JPY.

type Currency = "USD" | "EUR" | "JPY";
type ProductID = string; //In practice, this could be a more specific type

type GetProductEndpoint<C extends Currency> = `/products/${ProductID}/${C}`;

type USDEndpoint = GetProductEndpoint<"USD">; // type USDEndpoint = "/products/${string}/USD"

Šis piemērs definē GetProductEndpoint tipu, kas kā tipa parametru pieņem valūtu. Iegūtais tips ir virknes literāļa tips, kas attēlo API galapunktu produkta iegūšanai norādītajā valūtā. Izmantojot šo pieeju, varat nodrošināt, ka API galapunkts vienmēr tiek izveidots pareizi un tiek izmantota pareizā valūta.

2. Datu validācija

Veidņu literāļu tipus var izmantot, lai validētu datus kompilēšanas laikā. Piemēram, tos varētu izmantot, lai validētu tālruņa numura vai e-pasta adreses formātu. Iedomājieties, ka jums jāvalidē starptautiski tālruņu numuri, kuriem var būt dažādi formāti atkarībā no valsts koda.

type CountryCode = "+1" | "+44" | "+81"; // US, UK, Japan
type PhoneNumber<C extends CountryCode, N extends string> = `${C}-${N}`;

type ValidUSPhoneNumber = PhoneNumber<"+1", "555-123-4567">; // type ValidUSPhoneNumber = "+1-555-123-4567"

//Note: More complex validation might require combining template literal types with conditional types.

Šis piemērs parāda, kā var izveidot pamata tālruņa numura tipu, kas nosaka konkrētu formātu. Sarežģītākai validācijai varētu būt nepieciešams apvienot veidņu literāļu tipus ar nosacījumu tipiem.

3. Koda ģenerēšana

Veidņu literāļu tipus var izmantot, lai ģenerētu kodu kompilēšanas laikā. Piemēram, tos varētu izmantot, lai ģenerētu React komponenšu nosaukumus, pamatojoties uz datu nosaukumu, ko tie attēlo. Bieži sastopams modelis ir komponenšu nosaukumu ģenerēšana pēc <Entity>Details modeļa.

type Entity = "User" | "Product" | "Order";
type ComponentName<E extends Entity> = `${E}Details`;

type UserDetailsComponent = ComponentName<"User">; // type UserDetailsComponent = "UserDetails"

Tas ļauj automātiski ģenerēt komponenšu nosaukumus, kas ir konsekventi un aprakstoši, samazinot nosaukumu konfliktu risku un uzlabojot koda lasāmību.

4. Notikumu apstrāde

Veidņu literāļu tipi ir lieliski piemēroti, lai tipdrošā veidā definētu notikumu nosaukumus, nodrošinot, ka notikumu klausītāji tiek pareizi reģistrēti un notikumu apstrādātāji saņem paredzētos datus. Apsveriet sistēmu, kurā notikumi tiek iedalīti kategorijās pēc moduļa un notikuma veida, atdalot tos ar kolu.

type Module = "user" | "product" | "order";
type EventType = "created" | "updated" | "deleted";
type EventName<M extends Module, E extends EventType> = `${M}:${E}`;

type UserCreatedEvent = EventName<"user", "created">; // type UserCreatedEvent = "user:created"

interface EventMap {
  [key: EventName<Module, EventType>]: (data: any) => void; //Example: The type for event handling
}

Šis piemērs parāda, kā izveidot notikumu nosaukumus, kas atbilst konsekventam modelim, uzlabojot notikumu sistēmas vispārējo struktūru un tipu drošību.

Padziļinātas tehnikas

1. Kombinēšana ar nosacījumu tipiem

Veidņu literāļu tipus var kombinēt ar nosacījumu tipiem, lai izveidotu vēl sarežģītākas tipu transformācijas. Nosacījumu tipi ļauj definēt tipus, kas ir atkarīgi no citiem tipiem, ļaujot veikt sarežģītu loģiku tipu līmenī.

type ToUpperCase<S extends string> = S extends Uppercase<S> ? S : Uppercase<S>;

type MaybeUpperCase<S extends string, Upper extends boolean> = Upper extends true ? ToUpperCase<S> : S;

type Example = MaybeUpperCase<"hello", true>; // type Example = "HELLO"
type Example2 = MaybeUpperCase<"world", false>; // type Example2 = "world"

Šajā piemērā MaybeUpperCase pieņem virkni un Būla vērtību. Ja Būla vērtība ir patiesa, tas pārvērš virkni lielajos burtos; pretējā gadījumā tas atgriež virkni nemainītu. Tas parāda, kā var nosacīti modificēt virkņu tipus.

2. Izmantošana ar kartētajiem tipiem

Veidņu literāļu tipus var izmantot ar kartētajiem tipiem, lai transformētu objekta tipa atslēgas. Kartētie tipi ļauj izveidot jaunus tipus, iterējot pār esoša tipa atslēgām un katrai atslēgai piemērojot transformāciju. Bieži sastopams lietojums ir prefiksa vai sufiksa pievienošana objekta atslēgām.

type MyObject = {
  name: string;
  age: number;
};

type AddPrefix<T, Prefix extends string> = {
  [K in keyof T as `${Prefix}${string & K}`]: T[K];
};

type PrefixedObject = AddPrefix<MyObject, "data_">;
// type PrefixedObject = {
//    data_name: string;
//    data_age: number;
// }

Šeit AddPrefix pieņem objekta tipu un prefiksu. Pēc tam tas izveido jaunu objekta tipu ar tām pašām īpašībām, bet katrai atslēgai ir pievienots prefikss. Tas var būt noderīgi datu pārsūtīšanas objektu (DTO) vai citu tipu ģenerēšanai, kur nepieciešams modificēt īpašību nosaukumus.

3. Iebūvētie virkņu manipulācijas tipi

TypeScript nodrošina vairākus iebūvētos virkņu manipulācijas tipus, piemēram, Uppercase, Lowercase, Capitalize un Uncapitalize, kurus var izmantot kopā ar veidņu literāļu tipiem, lai veiktu sarežģītākas virkņu transformācijas.

type MyString = "hello world";

type CapitalizedString = Capitalize<MyString>; // type CapitalizedString = "Hello world"

type UpperCasedString = Uppercase<MyString>;   // type UpperCasedString = "HELLO WORLD"

Šie iebūvētie tipi atvieglo bieži sastopamu virkņu manipulāciju veikšanu, nerakstot pielāgotu tipu loģiku.

Labākās prakses

Biežākās kļūdas

Alternatīvas

Lai gan veidņu literāļu tipi piedāvā jaudīgu veidu, kā sasniegt tipu drošību API izstrādē, pastāv alternatīvas pieejas, kas noteiktās situācijās var būt piemērotākas.

Noslēgums

TypeScript veidņu literāļu tipi ir vērtīgs rīks tipdrošu un uzturamu API saskarņu izveidei. Tie ļauj veikt virkņu manipulācijas tipu līmenī, ļaujot notvert kļūdas kompilēšanas laikā un uzlabot koda kopējo kvalitāti. Izprotot šajā rakstā aplūkotās koncepcijas un tehnikas, jūs varat izmantot veidņu literāļu tipus, lai veidotu robustākas, uzticamākas un izstrādātājiem draudzīgākas API saskarnes. Neatkarīgi no tā, vai jūs veidojat sarežģītu tīmekļa lietojumprogrammu vai vienkāršu komandrindas rīku, veidņu literāļu tipi var palīdzēt jums rakstīt labāku TypeScript kodu.

Apsveriet iespēju izpētīt citus piemērus un eksperimentēt ar veidņu literāļu tipiem savos projektos, lai pilnībā aptvertu to potenciālu. Jo vairāk tos izmantosiet, jo ērtāk jutīsieties ar to sintaksi un iespējām, ļaujot jums izveidot patiesi tipdrošas un robustas lietojumprogrammas.